package com.birdboot.http;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.HashMap;

/**
 * 请求对象
 */
public class HttpServletRequest {
    private Socket socket;
    // 请求相关信息
    private String method;       // 抽象方法
    private String uri;          // 抽象路径
    private String protocol;     // 协议版本
    // 消息头相关信息
    private HashMap<String,String> headers = new HashMap<>();// 所有消息头

    public HttpServletRequest(Socket socket) throws IOException, EmptyRequestException { //实例化的时候进行解析请求内容
        this.socket = socket;
        // 1、解析请求

        // 1.1 解析请求行
        parseRequestLine();
        // 1.2 解析消息头
        parseHeaders();
        // 1.3 解析消息正文
        parseContent();

        // 2、处理请求



        // 3、发送响应
    }
    // 解析请求行
    private void parseRequestLine() throws IOException, EmptyRequestException {
        String line = readLine();
        // 如果请求行是空行，则对外抛出异常
        if (line.isEmpty()){
            throw new EmptyRequestException();
        }
        System.out.println("请求行："+line);
        // 将请求行中的请求方式，抽象路径，协议版本分别解析出来
        String[] data = line.split("\\s");
        method = data[0];
        uri = data[1];
        protocol = data[2];
        System.out.println("请求方式："+method);
        System.out.println("抽象路径：:"+uri);
        System.out.println("版本协议：:"+protocol);
    }
    // 解析消息头
    private void parseHeaders() throws IOException {
        while (true) {
            String line = readLine();
            if (line.isEmpty()){
                break;
            }
            System.out.println("消息头："+line);
            String[] data = line.split(":\\s");
            headers.put(data[0],data[1]);

        }
        System.out.println("headers:"+headers);
        headers.forEach((k,v)-> System.out.println(k+"的值是"+v));
    }
    // 解析消息正文
    private void parseContent(){

    }


    public String getMethod() {
        return method;
    }

    public String getUri() {
        return uri;
    }

    public String getProtocol() {
        return protocol;
    }

    public String getHeader(String name) {
        return headers.get(name);
    }

    // 将v2版本的run方法里测试读取一行字符串的操作封装成一个方法
    private String readLine() throws IOException {
        InputStream in = socket.getInputStream(); //获取到输入流，准备读取浏览器发来的请求
        int d;
        StringBuilder builder = new StringBuilder();// 保存拼接后的字符串
        char cur,pre = 'a';// cur表示本次读取的字符，pre表示上次读取的字符
        while ((d=in.read())!=-1) {
            cur = (char) d;
            if (pre==13 && cur==10){
                break;
            }
            builder.append(cur);
            pre=cur;
        }
        String line =  builder.toString().trim();
        return line;
    }
}
